#pragma once
#include "Message.hpp"
#include "Dispatch.hpp"
#include <mutex>
//保存不同类型的请求的回调处理函数
//当服务端和客户端接收到一条完整的消息后，判断是什么类型的消息然后从dispacth模块找到对应的回调处理函数处理即可
class Dispactch
{
    public:
    using DispaPtr=std::shared_ptr<Dispactch>;
    //注册消息处理回调方法函数
    void RegisterHander(Rs_RqType type,const Abstract::Ready_CallBack& callback)
    {
        std::unique_lock<std::mutex> _lock(_mutex);
        if(_Message_Handers.count(type)==0)
        {
            _Message_Handers.insert({type,callback});
        }
    }

    //把该成员函数设置为连接对象里的接收到消息时的回调函数
    void MessageCallback(const Abstract:: BaseConnection::ConPtr & Con, const Abstract::BaseMessage::MesaPtr &msg)
    {
        //到时候连接对象调用该函数直接查找对应的回调处理函数即可
         std::unique_lock<std::mutex> _lock(_mutex);
         if(_Message_Handers.count(msg->GetMtype()))
         {
            _Message_Handers[msg->GetMtype()](Con,msg);
         }
         else{
            DLOG("收到UNKOWN消息");
            Con->ShutDown();
         }

    }
    private:
    std::mutex _mutex;
    //存储不同类型的请求的回调处理函数
    std::unordered_map<Rs_RqType,Abstract::Ready_CallBack> _Message_Handers;
};

